home *** CD-ROM | disk | FTP | other *** search
/ PC Media 3 / PC MEDIA CD03.iso / share / prog / qmath10 / quad.asm next >
Encoding:
Assembly Source File  |  1993-07-12  |  12.2 KB  |  778 lines

  1. .model small,pascal
  2.  
  3. if @DataSize
  4.  
  5. LES_ equ les
  6. ES_ equ es:
  7. PUSH_ macro x
  8. push word ptr (x)+2
  9. push word ptr (x)
  10. endm
  11.  
  12. else
  13.  
  14. LES_ equ mov
  15. ES_ equ ds:
  16. PUSH_ macro x
  17. push x
  18. endm
  19.  
  20. endif
  21.  
  22. quad    struc
  23. q0    dw    ?
  24. q1    dw    ?
  25. q2    dw    ?
  26. q3    dw    ?
  27. quad    ends
  28.  
  29. .code
  30.  
  31. ;-----------------------------------------------------------------------------
  32. ;void pascal quadinc(quad* z, quad x)
  33. ;compute z=z+x
  34.  
  35. public    QUADINC
  36. QUADINC    proc    z:ptr, x:qword
  37.  
  38.     LES_    bx,z
  39.     mov    ax,(x).q0
  40.     add    ES_[bx].q0,ax
  41.     mov    ax,(x).q1
  42.     adc    ES_[bx].q1,ax
  43.     mov    ax,(x).q2
  44.     adc    ES_[bx].q2,ax
  45.     mov    ax,(x).q3
  46.     adc    ES_[bx].q3,ax
  47.     ret
  48.  
  49. QUADINC    endp
  50.  
  51. ;-----------------------------------------------------------------------------
  52. ;void pascal quadinca(quad* z, quad* x)
  53. ;compute z=z+x
  54.  
  55. public    QUADINCA
  56. QUADINCA    proc    uses si, z:ptr, x:ptr
  57.  
  58.     LES_    si,x
  59.     mov    ax,ES_[si].q0
  60.     mov    bx,ES_[si].q1
  61.     mov    cx,ES_[si].q2
  62.     mov    dx,ES_[si].q3
  63.     LES_    si,z
  64.     add    ES_[si].q0,ax
  65.     adc    ES_[si].q1,bx
  66.     adc    ES_[si].q2,cx
  67.     adc    ES_[si].q3,dx
  68.     ret
  69.  
  70. QUADINCA    endp
  71.  
  72. ;-----------------------------------------------------------------------------
  73. ;void pascal quaddec(quad* z, quad x)
  74. ;compute z=z-x
  75.  
  76. public    QUADDEC
  77. QUADDEC    proc    z:ptr, x:qword
  78.  
  79.     LES_    bx,z
  80.     mov    ax,(x).q0
  81.     sub    ES_[bx].q0,ax
  82.     mov    ax,(x).q1
  83.     sbb    ES_[bx].q1,ax
  84.     mov    ax,(x).q2
  85.     sbb    ES_[bx].q2,ax
  86.     mov    ax,(x).q3
  87.     sbb    ES_[bx].q3,ax
  88.     ret
  89.  
  90. QUADDEC    endp
  91.  
  92. ;-----------------------------------------------------------------------------
  93. ;void pascal quaddeca(quad* z, quad* x)
  94. ;compute z=z-x
  95.  
  96. public    QUADDECA
  97. QUADDECA    proc    uses si, z:ptr, x:ptr
  98.  
  99.     LES_    si,x
  100.     mov    ax,ES_[si].q0
  101.     mov    bx,ES_[si].q1
  102.     mov    cx,ES_[si].q2
  103.     mov    dx,ES_[si].q3
  104.     LES_    si,z
  105.     sub    ES_[si].q0,ax
  106.     sbb    ES_[si].q1,bx
  107.     sbb    ES_[si].q2,cx
  108.     sbb    ES_[si].q3,dx
  109.     ret
  110.  
  111. QUADDECA    endp
  112.  
  113. ;-----------------------------------------------------------------------------
  114. ;void pascal quadadd(quad* z, quad x, quad y)
  115. ;compute z=x+y
  116.  
  117. public    QUADADD
  118. QUADADD    proc    z:ptr, x:qword, y:qword
  119.  
  120.     LES_    bx,z
  121.     mov    ax,(x).q0
  122.     add    ax,(y).q0
  123.     mov    ES_[bx].q0,ax
  124.     mov    ax,(x).q1
  125.     adc    ax,(y).q1
  126.     mov    ES_[bx].q1,ax
  127.     mov    ax,(x).q2
  128.     adc    ax,(y).q2
  129.     mov    ES_[bx].q2,ax
  130.     mov    ax,(x).q3
  131.     adc    ax,(y).q3
  132.     mov    ES_[bx].q3,ax
  133.     ret
  134.  
  135. QUADADD    endp
  136.  
  137. ;-----------------------------------------------------------------------------
  138. ;void pascal quadadda(quad* z, quad* x, quad* y)
  139. ;compute z=x+y
  140.  
  141. public    QUADADDA
  142. QUADADDA    proc    uses si, z:ptr, x:ptr, y:ptr
  143.  
  144.     LES_    si,x
  145.     mov    ax,ES_[si].q0
  146.     mov    bx,ES_[si].q1
  147.     mov    cx,ES_[si].q2
  148.     mov    dx,ES_[si].q3
  149.     LES_    si,y
  150.     add    ax,ES_[si].q0
  151.     adc    bx,ES_[si].q1
  152.     adc    cx,ES_[si].q2
  153.     adc    dx,ES_[si].q3
  154.     LES_    si,z
  155.     mov    ES_[si].q0,ax
  156.     mov    ES_[si].q1,bx
  157.     mov    ES_[si].q2,cx
  158.     mov    ES_[si].q3,dx
  159.     ret
  160.  
  161. QUADADDA    endp
  162.  
  163. ;-----------------------------------------------------------------------------
  164. ;void pascal quadsub(quad* z, quad x, quad y)
  165. ;compute z=x-y
  166.  
  167. public    QUADSUB
  168. QUADSUB    proc    z:ptr, x:qword, y:qword
  169.  
  170.     LES_    bx,z
  171.     mov    ax,(x).q0
  172.     sub    ax,(y).q0
  173.     mov    ES_[bx].q0,ax
  174.     mov    ax,(x).q1
  175.     sbb    ax,(y).q1
  176.     mov    ES_[bx].q1,ax
  177.     mov    ax,(x).q2
  178.     sbb    ax,(y).q2
  179.     mov    ES_[bx].q2,ax
  180.     mov    ax,(x).q3
  181.     sbb    ax,(y).q3
  182.     mov    ES_[bx].q3,ax
  183.     ret
  184.  
  185. QUADSUB    endp
  186.  
  187. ;-----------------------------------------------------------------------------
  188. ;void pascal quadsuba(quad* z, quad* x, quad* y)
  189. ;compute z=x-y
  190.  
  191. public    QUADSUBA
  192. QUADSUBA    proc    uses si, z:ptr, x:ptr, y:ptr
  193.  
  194.     LES_    si,x
  195.     mov    ax,ES_[si].q0
  196.     mov    bx,ES_[si].q1
  197.     mov    cx,ES_[si].q2
  198.     mov    dx,ES_[si].q3
  199.     LES_    si,y
  200.     sub    ax,ES_[si].q0
  201.     sbb    bx,ES_[si].q1
  202.     sbb    cx,ES_[si].q2
  203.     sbb    dx,ES_[si].q3
  204.     LES_    si,z
  205.     mov    ES_[si].q0,ax
  206.     mov    ES_[si].q1,bx
  207.     mov    ES_[si].q2,cx
  208.     mov    ES_[si].q3,dx
  209.     ret
  210.  
  211. QUADSUBA    endp
  212.  
  213. ;-----------------------------------------------------------------------------
  214. ;void pascal quadmult(quad* z, quad x, quad y)
  215. ;compute z=x*y
  216.  
  217. public    QUADMULT
  218. QUADMULT    proc    uses si di, z:ptr, x:qword, y:qword
  219.  
  220.     LES_    bx,z
  221.  
  222.     mov    di,(x).q0
  223.     mov    si,(y).q0
  224.  
  225.     mov    ax,di
  226.     mul    si        ;x0*y0
  227.     mov    ES_[bx].q0,ax
  228.     mov    cx,dx
  229.  
  230.     mov    ax,di
  231.     mul    (y).q1        ;x0*y1
  232.     add    cx,ax
  233.     adc    dx,0
  234.  
  235.     mov    ax,si
  236.     mov    si,dx
  237.     mul    (x).q1        ;x1*y0
  238.     add    cx,ax
  239.     adc    si,dx
  240.     mov    ES_[bx].q1,cx
  241.     mov    cx,0
  242.     rcl    cx,1
  243.  
  244.     mov    ax,di
  245.     mul    (y).q2        ;x0*y2
  246.     add    si,ax
  247.     adc    cx,dx
  248.  
  249.     mov    ax,di
  250.     mul    (y).q3        ;x0*y3
  251.     add    cx,ax
  252.  
  253.     mov    ax,(x).q1
  254.     mul    (y).q1        ;x1*y1
  255.     add    si,ax
  256.     adc    cx,dx
  257.  
  258.     mov    di,(x).q2
  259.     mov    ax,di
  260.     mul    (y).q0        ;x2*y0
  261.     add    si,ax
  262.     mov    ES_[bx].q2,si
  263.     adc    cx,dx
  264.  
  265.     mov    ax,(x).q1
  266.     mul    (y).q2        ;x1*y2
  267.     add    cx,ax
  268.  
  269.     mov    ax,di
  270.     mul    (y).q1        ;x2*y1
  271.     add    cx,ax
  272.  
  273.     mov    ax,(x).q3
  274.     mul    (y).q0        ;x3*y0
  275.     add    cx,ax
  276.     mov    ES_[bx].q3,cx
  277.  
  278.     ret
  279.  
  280. QUADMULT    endp
  281.  
  282. ;-----------------------------------------------------------------------------
  283. ;void pascal quadmulta(quad* z, quad* x, quad* y)
  284. ;compute z=x*y
  285.  
  286. public    QUADMULTA
  287. QUADMULTA    proc    z:ptr, x:ptr, y:ptr
  288.  
  289.     PUSH_    z
  290.     LES_    bx,x
  291.     push    ES_[bx].q3
  292.     push    ES_[bx].q2
  293.     push    ES_[bx].q1
  294.     push    ES_[bx].q0
  295.     LES_    bx,y
  296.     push    ES_[bx].q3
  297.     push    ES_[bx].q2
  298.     push    ES_[bx].q1
  299.     push    ES_[bx].q0
  300.     call    QUADMULT
  301.  
  302.     ret
  303.  
  304. QUADMULTA    endp
  305.  
  306. ;-----------------------------------------------------------------------------
  307. ;void pascal quaddiv(quad* z, quad x, quad y)
  308. ;compute z=x/y
  309.  
  310. public    QUADDIV
  311. QUADDIV    proc    uses si di, z:ptr, x:qword, y:qword
  312.     local    zz:qword
  313.     local    sign:byte
  314.  
  315.     mov    sign,0
  316.  
  317.     mov    cx,(x).q3    ;check sign of x
  318.     or    cx,cx
  319.     jns    quaddiv01
  320.  
  321.     inc    sign
  322.     xor    ax,ax
  323.     mov    dx,ax
  324.     mov    bx,ax
  325.     mov    cx,ax
  326.     sub    ax,(x).q0
  327.     sbb    dx,(x).q1
  328.     sbb    bx,(x).q2
  329.     sbb    cx,(x).q3
  330.     mov    (x).q0,ax
  331.     mov    (x).q1,dx
  332.     mov    (x).q2,bx
  333.     mov    (x).q3,cx
  334. quaddiv01:
  335.     mov    cx,(y).q3    ;check sign of y
  336.     or    cx,cx
  337.     jns    quaddiv02
  338.  
  339.     inc    sign
  340.     xor    ax,ax
  341.     mov    dx,ax
  342.     mov    bx,ax
  343.     mov    cx,ax
  344.     sub    ax,(y).q0
  345.     sbb    dx,(y).q1
  346.     sbb    bx,(y).q2
  347.     sbb    cx,(y).q3
  348.     mov    (y).q0,ax
  349.     mov    (y).q1,dx
  350.     mov    (y).q2,bx
  351.     mov    (y).q3,cx
  352. quaddiv02:
  353.  
  354. ;---------------------------------------
  355.     jcxz    quaddiv03
  356.     jmp    quaddiv36    ;2^48 <= y
  357. quaddiv03:
  358.     mov    cx,(y).q2
  359.     jcxz    quaddiv04
  360.     jmp    quaddiv25    ;2^32 <= y < 2^48
  361. quaddiv04:
  362.     mov    cx,(y).q1
  363.     jcxz    quaddiv05
  364.     jmp    quaddiv07    ;2^16 <= y < 2^32
  365. quaddiv05:
  366.     mov    cx,(y).q0
  367.     jcxz    quaddiv06
  368.  
  369. ;---------------------------------------
  370. ;y < 2^16:
  371.  
  372.     xor    dx,dx
  373.     mov    ax,(x).q3
  374.     div    cx
  375.     mov    di,ax
  376.     mov    ax,(x).q2
  377.     div    cx
  378.     mov    si,ax
  379.     mov    ax,(x).q1
  380.     div    cx
  381.     mov    bx,ax
  382.     mov    ax,(x).q0
  383.     div    cx
  384.     mov    dx,bx
  385.     jmp    quaddiv40
  386. quaddiv06:
  387.     jmp    quaddiv42
  388.  
  389. ;---------------------------------------
  390. ;2^16 <= y < 2^32:
  391.  
  392. quaddiv07:
  393.     mov    bx,(y).q0
  394.     mov    dx,(x).q3
  395.     mov    ax,(x).q2
  396. quaddiv08:
  397.     shr    cx,1        ;shift right x and y until y < 2^16
  398.     rcr    bx,1
  399.     shr    dx,1
  400.     rcr    ax,1
  401.     or    cx,cx
  402.     jnz    quaddiv08
  403.  
  404.     div    bx        ;estimate (z).q2
  405.     or    ax,ax
  406.     jz    quaddiv10
  407.     mov    di,ax        ;multiply y by (z).q2
  408.     mul    (y).q0
  409.     mov    bx,ax
  410.     mov    cx,dx
  411.     mov    ax,(y).q1
  412.     mul    di
  413.     add    cx,ax
  414.  
  415.     mov    dx,(x).q2    ;subtract product from x
  416.     mov    si,(x).q3
  417.     sub    dx,bx
  418.     sbb    si,cx
  419.     jnc    quaddiv09
  420.  
  421.     dec    di        ;decrement (z).q2 if (z).q2*y > x
  422.     add    dx,(y).q0
  423.     adc    si,(y).q1
  424. quaddiv09:
  425.     mov    (x).q2,dx    ;store x
  426.     mov    (x).q3,si
  427.     mov    (zz).q2,di
  428.     jmp    quaddiv11
  429. quaddiv10:
  430.     mov    (zz).q2,ax
  431.     mov    si,(x).q3
  432.     mov    dx,(x).q2
  433.  
  434. ;-----------------------
  435. quaddiv11:
  436.     mov    ax,(x).q1
  437.     mov    cx,(y).q1
  438.     mov    bx,(y).q0
  439. quaddiv12:
  440.     shr    cx,1        ;shift right x and y until y < 2^16
  441.     rcr    bx,1
  442.     shr    si,1
  443.     rcr    dx,1
  444.     rcr    ax,1
  445.     or    cx,cx
  446.     jnz    quaddiv12
  447.  
  448.     cmp    dx,bx
  449.     jb    quaddiv13
  450.     mov    ax,0ffffh
  451.     jmp    quaddiv14
  452. quaddiv13:
  453.     div    bx        ;estimate (z).q1
  454. quaddiv14:
  455.     mov    (zz).q1,ax
  456.     or    ax,ax
  457.     jz    quaddiv17
  458.     mov    di,ax        ;multiply y by (z).q1
  459.     mul    (y).q0
  460.     mov    bx,ax
  461.     mov    cx,dx
  462.     mov    ax,(y).q1
  463.     mul    di
  464.     xor    si,si
  465.     add    cx,ax
  466.     adc    si,dx
  467.  
  468.     mov    dx,(x).q1    ;subtract product from x
  469.     mov    di,(x).q2
  470.     mov    ax,(x).q3
  471.     sub    dx,bx
  472.     sbb    di,cx
  473.     sbb    ax,si
  474.     jnc    quaddiv16
  475. quaddiv15:
  476.     dec    (zz).q1        ;decrement (z).q1 if (z).q1*y > x
  477.     add    dx,(y).q0
  478.     adc    di,(y).q1
  479.     adc    ax,0
  480.     jnc    quaddiv15
  481. quaddiv16:
  482.     mov    (x).q1,dx    ;store x
  483.     mov    (x).q2,di
  484.     jmp    quaddiv18
  485. quaddiv17:
  486.     mov    di,(x).q2
  487.     mov    dx,(x).q1
  488.  
  489. ;-----------------------
  490. quaddiv18:
  491.     mov    ax,(x).q0
  492.     mov    cx,(y).q1
  493.     mov    bx,(y).q0
  494. quaddiv19:
  495.     shr    cx,1        ;shift right x and y until y < 2^16
  496.     rcr    bx,1
  497.     shr    di,1
  498.     rcr    dx,1
  499.     rcr    ax,1
  500.     or    cx,cx
  501.     jnz    quaddiv19
  502.  
  503.     cmp    dx,bx
  504.     jb    quaddiv20
  505.     mov    ax,0ffffh
  506.     jmp    quaddiv21
  507. quaddiv20:
  508.     div    bx        ;estimate (z).q0
  509.     or    ax,ax
  510.     jz    quaddiv24
  511. quaddiv21:
  512.     mov    (zz).q0,ax
  513.     mov    di,ax        ;multiply y by (z).q0
  514.     mul    (y).q0
  515.     mov    bx,ax
  516.     mov    cx,dx
  517.     mov    ax,(y).q1
  518.     mul    di
  519.     xor    si,si
  520.     add    cx,ax
  521.     adc    si,dx
  522.  
  523.     mov    dx,(x).q0    ;subtract product from x
  524.     mov    di,(x).q1
  525.     mov    ax,(x).q2
  526.     sub    dx,bx
  527.     sbb    di,cx
  528.     sbb    ax,si
  529.     jnc    quaddiv23
  530. quaddiv22:
  531.     dec    (zz).q0        ;decrement (z).q0 if (z).q0*y > x
  532.     add    dx,(y).q0
  533.     adc    di,(y).q1
  534.     adc    ax,0
  535.     jnc    quaddiv22
  536. quaddiv23:
  537.     mov    ax,(zz).q0
  538. quaddiv24:
  539.     mov    dx,(zz).q1
  540.     mov    si,(zz).q2
  541.     xor    di,di
  542.     jmp    quaddiv40
  543.  
  544. ;---------------------------------------
  545. ;2^32 <= y < 2^48:
  546.  
  547. quaddiv25:
  548.     mov    bx,(y).q1
  549.     mov    dx,(x).q3
  550.     mov    ax,(x).q2
  551. quaddiv26:
  552.     shr    cx,1        ;shift right x and y until y < 2^32
  553.     rcr    bx,1
  554.     shr    dx,1
  555.     rcr    ax,1
  556.     or    cx,cx
  557.     jnz    quaddiv26
  558.  
  559.     div    bx        ;estimate (z).q1
  560.     mov    (zz).q1,ax
  561.     or    ax,ax
  562.     jz    quaddiv28
  563.     mov    di,ax        ;multiply y by (z).q1
  564.     mul    (y).q0
  565.     mov    bx,ax
  566.     mov    cx,dx
  567.     mov    ax,(y).q1
  568.     mul    di
  569.     xor    si,si
  570.     add    cx,ax
  571.     adc    si,dx
  572.     mov    ax,(y).q2
  573.     mul    di
  574.     add    si,ax
  575.  
  576.     mov    ax,(x).q1    ;subtract product from x
  577.     mov    dx,(x).q2
  578.     mov    di,(x).q3
  579.     sub    ax,bx
  580.     sbb    dx,cx
  581.     sbb    di,si
  582.     jnc    quaddiv27
  583.  
  584.     dec    (zz).q1        ;decrement (z).q1 if too large
  585.     add    ax,(y).q0
  586.     adc    dx,(y).q1
  587.     adc    di,(y).q2
  588. quaddiv27:
  589.     mov    (x).q1,ax    ;store x
  590.     mov    (x).q2,dx
  591.     mov    (x).q3,di
  592.     jmp    quaddiv29
  593. quaddiv28:
  594.     mov    di,(x).q3
  595.     mov    dx,(x).q2
  596.     mov    ax,(x).q1
  597.  
  598. ;-----------------------
  599. quaddiv29:
  600.     mov    cx,(y).q2
  601.     mov    bx,(y).q1
  602. quaddiv30:
  603.     shr    cx,1        ;shift right x and y until y < 2^32
  604.     rcr    bx,1
  605.     shr    di,1
  606.     rcr    dx,1
  607.     rcr    ax,1
  608.     or    cx,cx
  609.     jnz    quaddiv30
  610.  
  611.     cmp    dx,bx
  612.     jb    quaddiv31
  613.     mov    ax,0ffffh
  614.     jmp    quaddiv32
  615. quaddiv31:
  616.     div    bx        ;estimate (z).q0
  617.     or    ax,ax
  618.     jz    quaddiv35
  619. quaddiv32:
  620.     mov    (zz).q0,ax
  621.     mov    di,ax        ;multiply y by (z).q0
  622.     mul    (y).q0
  623.     mov    bx,ax
  624.     mov    cx,dx
  625.     mov    ax,(y).q1
  626.     mul    di
  627.     xor    si,si
  628.     add    cx,ax
  629.     adc    si,dx
  630.     mov    ax,(y).q2
  631.     mul    di
  632.     add    si,ax
  633.     adc    dx,0
  634.  
  635.     mov    ax,(x).q0    ;subtract product from x
  636.     mov    di,(x).q1
  637.     sub    ax,bx
  638.     sbb    di,cx
  639.     sbb    (x).q2,si
  640.     sbb    (x).q3,dx
  641.     jnc    quaddiv34
  642.  
  643.     mov    bx,(x).q2
  644.     mov    cx,(x).q3
  645. quaddiv33:
  646.     dec    (zz).q0        ;decrement (z).q0 if (z).q0*y > x
  647.     add    ax,(y).q0
  648.     adc    di,(y).q1
  649.     adc    bx,(y).q2
  650.     adc    cx,0
  651.     jnc    quaddiv33
  652. quaddiv34:
  653.     mov    ax,(zz).q0
  654. quaddiv35:
  655.     mov    dx,(zz).q1
  656.     xor    si,si
  657.     mov    di,si
  658.     jmp    quaddiv40
  659.  
  660. ;---------------------------------------
  661. ;2^48 <= y:
  662.  
  663. quaddiv36:
  664.     mov    bx,(y).q2
  665.     mov    dx,(x).q3
  666.     mov    ax,(x).q2
  667. quaddiv37:
  668.     shr    cx,1        ;shift right x and y until y < 2^48
  669.     rcr    bx,1
  670.     shr    dx,1
  671.     rcr    ax,1
  672.     or    cx,cx
  673.     jnz    quaddiv37
  674.  
  675.     div    bx        ;estimate z
  676.     or    ax,ax
  677.     jz    quaddiv39
  678.     mov    (zz).q0,ax
  679.     mov    di,ax        ;multiply y by z
  680.     mul    (y).q0
  681.     mov    bx,ax
  682.     mov    cx,dx
  683.     mov    ax,(y).q1
  684.     mul    di
  685.     xor    si,si
  686.     add    cx,ax
  687.     adc    si,dx
  688.     mov    ax,(y).q2
  689.     mul    di
  690.     add    si,ax
  691.     adc    dx,0
  692.     xchg    dx,di
  693.     mov    ax,(y).q3
  694.     mul    dx
  695.     add    di,ax
  696.  
  697.     mov    ax,(zz).q0
  698.     cmp    di,(x).q3
  699.     ja    quaddiv38
  700.     jb    quaddiv39
  701.     cmp    si,(x).q2
  702.     ja    quaddiv38
  703.     jb    quaddiv39
  704.     cmp    cx,(x).q1
  705.     ja    quaddiv38
  706.     jb    quaddiv39
  707.     cmp    bx,(x).q0
  708.     jbe    quaddiv39
  709. quaddiv38:
  710.     dec    ax        ;decrement z if z*y > x
  711. quaddiv39:
  712.     xor    dx,dx
  713.     mov    si,dx
  714.     mov    di,dx
  715.  
  716. ;---------------------------------------
  717. quaddiv40:
  718.     test    sign,1
  719.     jz    quaddiv41
  720.  
  721.     xor    cx,cx        ;change sign of result
  722.     neg    ax
  723.     adc    dx,cx
  724.     adc    si,cx
  725.     adc    di,cx
  726.     neg    dx
  727.     adc    si,cx
  728.     adc    di,cx
  729.     neg    si
  730.     adc    di,cx
  731.     neg    di
  732.  
  733. quaddiv41:
  734.     LES_    bx,z
  735.     mov    ES_[bx].q0,ax
  736.     mov    ES_[bx].q1,dx
  737.     mov    ES_[bx].q2,si
  738.     mov    ES_[bx].q3,di
  739.  
  740.     ret
  741.  
  742. quaddiv42:            ;divide error
  743.     xor    ax,ax
  744.     dec    ax
  745.     cwd
  746.     mov    si,ax
  747.     mov    di,7fffh
  748.     jmp    quaddiv40    ;return 7fffffffffffffffh
  749.  
  750. QUADDIV    endp
  751.  
  752. ;-----------------------------------------------------------------------------
  753. ;void pascal quaddiva(quad* z, quad* x, quad* y)
  754. ;compute z=x*y
  755.  
  756. public    QUADDIVA
  757. QUADDIVA    proc    z:ptr, x:ptr, y:ptr
  758.  
  759.     PUSH_    z
  760.     LES_    bx,x
  761.     push    ES_[bx].q3
  762.     push    ES_[bx].q2
  763.     push    ES_[bx].q1
  764.     push    ES_[bx].q0
  765.     LES_    bx,y
  766.     push    ES_[bx].q3
  767.     push    ES_[bx].q2
  768.     push    ES_[bx].q1
  769.     push    ES_[bx].q0
  770.     call    QUADDIV
  771.  
  772.     ret
  773.  
  774. QUADDIVA    endp
  775.  
  776. ;-----------------------------------------------------------------------------
  777. end
  778.